#include "safequeue.h"

// 返回队列是否为空
template <typename T>
bool SafeQueue<T>::empty() {
    std::unique_lock<std::mutex> lock(m_mutex); // 互斥信号变量加锁，防止m_queue被改变
    return m_queue.empty();
};

template <typename T>
int SafeQueue<T>::size() {
    std::unique_lock<std::mutex> lock(m_mutex); // 互斥信号变量加锁，防止m_queue被改变
    return m_queue.size();
};

// 队列添加元素
template <typename T>
void SafeQueue<T>::enqueue(T &t) {
    std::unique_lock<std::mutex> lock(m_mutex);
    m_queue.emplace(t);
};

// 队列取出元素
template <typename T>
bool SafeQueue<T>::dequeue(T &t){
    std::unique_lock<std::mutex> lock(m_mutex); // 队列加锁
    if (m_queue.empty())
        return false;
    t = std::move(m_queue.front()); // 取出队首元素，返回队首元素值，并进行右值引用
    m_queue.pop(); // 弹出入队的第一个元素
    return true;
};
